package com.ljxt.dt.util.xhq;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author 徐浩钦
 * @version 1.0.0
 * @date 2020/5/2 9:10
 * @copyright 老九学堂T11
 */
public class StringUtil implements Serializable {

    /**
     * 时间转换的默认格式
     */
    private static final String DATAFORMAT = "yyyy-MM-dd HH:mm:ss";

    /**
     * 根据指定的格式进行转换格式化时间
     * @param date 转换的时间
     * @param strFormat 格式的字符串
     * @return 转换后的时间字符串
     */
    public static String dateFormat(Date date,String strFormat){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(strFormat);
        return simpleDateFormat.format(date);
    }

    /**
     * 根据时间转换为格式化的字符串
     * @param date 需要转换的时间
     * @return 转换后的字符串
     */
    public static String dateFormat(Date date){
        return dateFormat(date,DATAFORMAT);
    }

    /**
     * 用来判断一个字符串是否为空串或者 null
     * @param string 判断的字符串
     * @return 判断的结果
     */
    public static boolean isNullAndEmpty (String string){
        boolean returned = false;

        if(string == null || string.isEmpty()){
            returned = true;
        }

        return returned;
    }

    /**
     * 这是个驼峰转下划线的方法
     * @return
     */
    public static String tuoFengToXiaHua (String tuoFeng){
        char[] tests = tuoFeng.toCharArray();
        String result = "";

        // 计算一共有多少个大写
        for(int i = tests.length-1; i >= 0; i--) {
            char temp = tests[i];
            // 判断是否大写
            if(temp >= 65 && temp<= 90) {
                temp += 32;
                result += (temp + "_");
            }else {
                result += (temp + "");
            }
        }

        StringBuffer sb = new StringBuffer();
        return sb.append(result).reverse().toString();
    }

    /**
     * 这是个将下划线转驼峰的命名
     * @param xiaHua
     * @return
     */
    public static String xiaHuaToTuoFeng(String xiaHua){
        char[] tests = xiaHua.toCharArray();
        String result = "";

        for (int i = 0; i < tests.length; i++) {
            char temp = tests[i];
            // 判断是否为下划线 并且不是在最后一位
            if(temp == 95 && i < tests.length -1) {
                // 小写字母
                if(tests[i+1] >= 97 && tests[i+1]<= 122){
                    // 进行转换
                    temp = tests[i+1];
                    result+=(temp-=32);
                    i++;
                }else if(tests[i+1] >= 65 && tests[i+1] <= 90){
                    // 大写就直接拼接 然后i++
                    result+=tests[i+1];
                    i++;
                }

            }else if(temp != 95){
                // 如果除了下划线后面还有大写字母则转成小写
                if(temp >= 65 && temp<= 90){
                    temp += 32;
                }
                result+=temp;
            }
        }
        return result;
    }

    /**
     * 这是一个将 map 转换为 SQL 语句的工具
     * @param map 需要转换的 map 集合
     * @return 返回值的 map 中 key="sql" 可以取出 sql 语句，key="array" 可以取出参数数组
     */
    public static Map<String,Object> mapToSql (Map<String, Object> map){
        List<Object> list = new ArrayList<>();
        String result= "";

        for (Map.Entry<String, Object> i:
             map.entrySet()) {
            result += " and " + tuoFengToXiaHua(i.getKey())  + " = ? ";
            list.add(i.getValue());
        }

        map.put("sql",result);
        map.put("array",list.toArray());

        return map;
    }

    public static<T> void showList(List<T> lists){
        System.out.println("----------------- show lists ------------------");
        for (T obj:
                lists) {
            System.out.println(obj);
        }
        System.out.println("----------------- show lists ------------------");
    }

    public static void showListMap(List<Map<String,Object>> lists){
        System.out.println("----------------- showListMap ------------------");

        for (Map<String, Object> temp:
                lists) {
            for (Map.Entry<String, Object> mm:
                    temp.entrySet()) {
                System.out.println(mm.getKey() +" - "+ mm.getValue());
            }
        }

        System.out.println("----------------- showListMap ------------------");
    }


}
